﻿using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace Extension {
  /// <summary>
  /// 加密
  /// </summary>
  public static class Encryption {

    /// <summary>
    ///   使用RSA加密
    /// </summary>
    /// <param name="encryptData">待加密的数据</param>
    /// <param name="key">密钥</param>
    /// <returns>密文</returns>
    public static string EncryptRSA(string encryptData, string key) {
      if(encryptData == null) return null;
      //密匙容器的名称，保持加密解密一致才能解密成功
      var param = new CspParameters { KeyContainerName = key };

      using(var rsa = new RSACryptoServiceProvider(param)) {
        // 将待加密的字符串转换为字节数组
        var plainData = Encoding.UTF8.GetBytes(encryptData);
        // 获取加密后的字节数组
        var encryptdata = rsa.Encrypt(plainData, false);

        // 将加密后的字节数组转换为字符串
        return Convert.ToBase64String(encryptdata);
      }
    }
    public static string Encode(string str) => str.Aggregate("", (current, t) => current + (char)(t + 10 - 1 * 2));

    public static string EncryptMD5WithBit16(string encryptData) {
      using(var md5 = new MD5CryptoServiceProvider()) {
        var b = Encoding.UTF8.GetBytes(encryptData);
        var hashcode = md5.ComputeHash(b);
        string t2 = BitConverter.ToString(hashcode, 4, 8);
        t2 = t2.Replace("-", "");
        return t2;
      }
    }
    /// <summary>
    /// 32位MD5加密
    /// </summary>
    /// <param name="encryptData"></param>
    /// <returns></returns>
    public static string EncryptMD5WithBit32(string encryptData) {
      string cl = encryptData;
      string d = "";
      //实例化一个md5对像
      MD5 md5 = MD5.Create();
      // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
      byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
      // 通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化所得
      foreach(byte t in s) {
        // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写（X）则格式后的字符是大写字符 
        d += t.ToString("X");
      }
      return d;
    }
    public static string EncryptMD5WithBit64(string encryptData) {
      string cl = encryptData;
      //string pwd = "";
      MD5 md5 = MD5.Create(); //实例化一个md5对像
      // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
      byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
      return Convert.ToBase64String(s);
    }
  }
}
